/**
 * 执行变更操作(增/删/改)
 * @param {Object} param 执行参数 json类型
 * param.sqlId 执行语句
 * param.sqlParam 执行参数
 * param.dbName 执行数据源
 * param.complete 执行完成后回调函数
 * param.success 成功回调函数
 * param.error 失败回调函数
 * param.msgFlag 是否给出执行结果提示
 * param.msg 成功自定义提示信息
 * param.errMsg 失败自定义提示信息
 */
function execModify(param){
    var p = genParam(param);
    if (p == null) return;
    if (param.msgFlag!=false) param.msgFlag = true;
    $.post("../common/modify", p, function(data) {
        if (param.complete) param.complete();
        if (data=="success") {
            if (param.success) param.success();
            if (param.msgFlag) $.messager.alert("提示", param.msg||"保存成功！", "info");
        } else {
            if (param.error) param.error();
            if (param.msgFlag) $.messager.alert("提示", param.errMsg||"保存失败！", "error");
        }
    });
}
/**
 * 表单数据提交
 * @param {Object} param 执行参数
 * param.form 表单ID
 * param.onSubmit 提交前事件
 * param.afterSubmit 提交后处理事件
 * param.success 成功提交成功后事件
 * param.error 失败提交失败后事件
 * param.msg 成功自定义提示信息
 * param.errMsg 自定义提示信息
 */
function saveForm(param){
    param.url = "../common/saveForm";
    if (param.msgFlag!=false) param.msgFlag = true;
    var succ = param.success || null; // 与form插件的success方法重名
    param.success = function(data) {
        if (param.afterSubmit) param.afterSubmit(data);
        if (data=="success") {
            if (succ) succ();
            if (param.msgFlag) $.messager.alert("提示", param.msg||"保存成功！", "info");
        } else {
            if (param.error) param.error();
            if (param.msgFlag) $.messager.alert("提示", param.errMsg||"保存失败！", "error");
        }
    };
    $(param.form).form("submit", param);
}
function genParam(data) {
    var sqlId = data.sqlId, sqlParam = data.sqlParam, param = {}, l1 = -1, l2 = -1;
    if (!sqlId) return null;
    if (sqlId instanceof Array) {
        param.sqlId = JSON.stringify(sqlId);
        l1 = sqlId.length;
    } else {
        param.sqlId = sqlId;
    }
    if (sqlParam) {
        param.sqlParam = JSON.stringify(sqlParam);
        if (sqlParam instanceof Array) {
            l2 = sqlParam.length;
        }
    }
    if (l1!=-1 && l2!=-1&& l1!=l2) // 批量操作批量传参的情况，但参数组数量不同
        return null;
    if (data.dbName) {
        param.dbName = data.dbName;
    }
    return param;
}

/**
 * rowEditDatagrid插件
 */
(function($){
    $.fn.datagrid.defaults.onBeforeLoad = function(param){
        if ($.data(this,"datagrid").options.editorOptions) $(this).datagrid("rejectChanges").data("lastEditRowIndex",-1);
    };
    $.fn.datagrid.defaults.onSelect = function(rowIndex,rowData){
        var eo = $.data(this,"datagrid").options.editorOptions;
        if (!eo) return;
        var tab = $(this), idx = tab.data("lastEditRowIndex");
        if (rowIndex == idx) return; // 就是选中行
        if ((eo.validateOnBlur==undefined || eo.validateOnBlur==true) && !validateRow(tab,idx)) { // 上一个编辑行信息填写校验不通过
            tab.datagrid("selectRow", idx);
            setTimeout(function(){tab.datagrid("unselectRow", rowIndex);},1);
            return;
        }
        tab.datagrid("endEdit",idx).datagrid("beginEdit",rowIndex).data("lastEditRowIndex",rowIndex);
        var s = $.data(this,"datagrid").options.editorOptions.onSelect; // 选中事件接口
        if (s) s(tab,rowIndex,rowData);
    };
    $.fn.datagrid.methods.addRow = function(jq, row){
        return jq.each(function(){
            var tab = $(this), idx = tab.data("lastEditRowIndex"), eo = $.data(this,"datagrid").options.editorOptions;;
            if ((eo.validateOnBlur==undefined || eo.validateOnBlur==true) && !validateRow(tab,idx)) return;
            tab.datagrid("endEdit",idx).data("lastEditRowIndex",-1).datagrid("appendRow",row||{}).datagrid("selectRow",tab.datagrid("getRows").length-1);
        });
    };
    $.fn.datagrid.methods.removeRow = function(jq){
        return jq.each(function(){
            var tab = $(this), idx = tab.data("lastEditRowIndex");
            if (idx==-1) return;
            tab.datagrid("deleteRow", idx).data("lastEditRowIndex", -1);
        });
    };
    $.fn.datagrid.methods.saveChanges = function(jq, p){
        return jq.each(function(){
            var tab = $(this), idx = tab.data("lastEditRowIndex"), op = $.data(this,"datagrid").options.editorOptions, sid = op.sqlId;
            if ((op.validateOnBlur==undefined || op.validateOnBlur==true) && !validateRow(tab,idx)) return;
            tab.datagrid("endEdit",idx).data("lastEditRowIndex",-1);
            if (tab.datagrid("getChanges").length==0 && !p) return; // 无变更且无额外更新内容

            if (op.onBeforeSave) { // 保存前事件接口
                var f = op.onBeforeSave(tab);
                if (f!=undefined && f==false) return; // 返回false时退出
            }
            var ids = [], params = [];
            var del = tab.datagrid("getChanges", "deleted");
            if (del.length>0) addParam(sid.delete, del);
            var ins = tab.datagrid("getChanges", "inserted");
            if (ins.length>0) addParam(sid.insert, ins);
            var upd = tab.datagrid("getChanges", "updated");
            if (upd.length>0) addParam(sid.update, upd);
            if (p && p.sqlId) { // 除了表格更新外的额外执行语句
                ids.push(p.sqlId);
                params.push(p.sqlParam);
            }
            var exec={sqlId:ids,sqlParam:params,success:function(){
                tab.datagrid("acceptChanges").data("lastEditRowIndex",-1).datagrid("load");
                if (op.onAfterSave) op.onAfterSave(tab);  // 保存后事件接口
                if (op.onSaveSuccess) op.onSaveSuccess(tab);  // 保存后事件接口
            },error:function(){
                if (op.onAfterSave) op.onAfterSave(tab);  // 保存后事件接口
                if (op.onSaveError) op.onSaveError(tab);  // 保存后事件接口
            }};
            if(op.dbName) exec.dbName=op.dbName;
            if(op.msgFlag!=undefined) exec.msgFlag=op.msgFlag;
            execModify(exec);
            function addParam(sqlId,sqlParam) {
                if (sqlId instanceof Array) {
                    for (var i=0; i<sqlId.length; i++) {
                        ids.push(sqlId[i]);
                        params.push(sqlParam);
                    }
                } else {
                    ids.push(sqlId);
                    params.push(sqlParam);
                }
            }
        });
    };
    $.fn.datagrid.methods.validate = function(tab){
        return validateRow(tab, tab.data("lastEditRowIndex"));
    };
    $.fn.datagrid.methods.getSelctedRowIndex = function(tab) {
        return tab.data("lastEditRowIndex");
    };
    function validateRow(tab, idx){
        if (idx==-1) return true;
        var ret = true, v = $.data(tab[0],"datagrid").options.editorOptions.validate; // 校验接口
        if (v) ret = v(tab, idx);
        return ret && tab.datagrid("validateRow", idx);
    }
})(jQuery);
